/**
 * \file HeightWidth.h
 *
 * \brief Enthält die Klasse HeightWidth.
 */

#ifndef _HEIGHTWIDTH_H_
#define _HEIGHTWIDTH_H_

/** \class HeigthWidth
*       \brief Objekte der Klasse HeightWidth dienen dazu Horizontale und Vertikale Werte zu speichern.
*
*       Diese Kombination von Werten wird für das Zweidimensionale Feld häufig benötigt.
*/

class HeightWidth
{
        private:
                int height;     /**< Die vertikale Position oder Ausdehnung. */
                int width;              /**< Die horizontale Position oder Ausdehnung. */
				        inline int true_mod(int a, int b) const;
        
        public:
        				/**
        				* 			\fn HeightWidth operator +(const HeightWidth& b) const
        				*				\brief Addiert zwei HeightWidth-Objekte komponentenweise.
        				*       \param b Das Objekt, welches addiert wird.
        				*/
        				HeightWidth operator +(const HeightWidth& b) const;
        				
        				/**
        				* 			\fn HeightWidth operator %(const HeightWidth& b) const
        				*				\brief Wendet die Modulo-Operation komponentenweise auf zwei HeightWidth-Objekte an.
        				*       \param b Das Objekt, welches dividiert wird.
        				*/
        				HeightWidth operator %(const HeightWidth& b) const;
        				
                /**
                *       \fn void setHeight(int height)
                *       \brief Setzt die vertikale Komponente.
                *       \param height Die neue vertikale Komponente.
                */
                void setHeight(int);
                
                /**
                *       \fn void setWidth(int width)
                *       \brief Setzt die horizontale Komponente.
                *       \param width Die neue horizontale Komponente.
                */
                void setWidth(int);

                /**
                *       \fn int getHeight()
                *       \brief Gibt die vertikale Komponente zurück.
                */
                int getHeight() const;

                /**
                *       \fn int getWidth();
                *       \brief Gibt die horizontale Komponente zurück.
                */
                int getWidth() const;
                
                /**
                * \fn bool operator <(const HeightWidth& b) const;
                * \brief Partielle Ordnung von HeightWidth-Objekten. Es gilt genau dann a < b, wenn Höhe von a kleiner als Höhe von b und Breite von a kleiner als Breite von b sind.
                */
                bool operator <(const HeightWidth& b) const;

                /**
                *       \fn HeightWidth()
                *       \param b Das HeightWidth-Objekt, mit dem verglichen wird.
                *       \brief Der Standardkonstruktor.
                */
                HeightWidth();
                
                /**
                *       \fn HeightWidth(int height, int width)
                *       \brief Ein Konstruktor, der die Werte initialisiert.
                */
                HeightWidth(int,int);

                /**
                *       \fn ~HeightWidth()
                *       \brief Der Destruktor.
                */
                ~HeightWidth();
};

#endif
